<?php

if (!isset($_SESSION)) {
    session_start();
}

define('DS', DIRECTORY_SEPARATOR);
if ($_SERVER["SERVER_NAME"] == "localhost" || $_SERVER["SERVER_NAME"] == "local.agoraestude") {
    $pasta = "";
    if (strpos($_SERVER["REQUEST_URI"], "trunk") == 1) {
        $pasta = "trunk/";
    }
    $urlAbsolute = "http://" . $_SERVER["HTTP_HOST"] . "/" . $pasta . "agoraEstude/public/";
} else {
    $urlAbsolute = "http://www.agoraestude.com.br/";
}

//define url absolute para o carregamento do layout
if (!defined('BASE_URL')) {
    define('BASE_URL', $urlAbsolute);
}

$diretorioAplicacao = realpath(__DIR__ . DS . '..') . DS;
//Carrega as configurações da aplicação
$config = require_once $diretorioAplicacao . 'config.php';

$diretorioController = $diretorioAplicacao . 'controllers' . DS;
$nomeController = 'Principal';
$nomeAction = 'principal';

//determina o controle e a action
if (isset($_GET['__c']) && !empty($_GET['__c'])) {

    $parts = explode('/', $_GET['__c']);
    if (isset($parts[0])) {
        $nomeController = ucfirst(strtolower($parts[0]));
    }
    if (isset($parts[1])) {
        $nomeAction = $parts[1];
    }
}

//Guarda o nome do recurso acessado para a validação do ACL
$nomeRecursoAcl = strtolower($nomeController . '/' . $nomeAction);

//Verifica se o arquivo da controller existe
$nomeController = 'Controller' . $nomeController;
$arquivoController = $diretorioController . $nomeController . '.php';

if (file_exists($arquivoController)) {
    require_once $arquivoController;

    if (!class_exists($nomeController)) {
        //Classe nao definida
        throw new Exception('Classe ' . $nomeController . ' nao existe');
    }

    //Instanciamos a controller
    $controller = new $nomeController($config);

    // adiciona underline caso a action comece com número
    if($nomeAction == "404" || $nomeAction == "304"){
        $nomeAction = "_".$nomeAction;
    }

    //Action nao existe
    if (!method_exists($controller, $nomeAction)) {
        require_once $diretorioController . 'ControllerErro.php';
        $erro = new ControllerErro($config);
        $erro->_404();
        die();
    }

    //Verifica se metodo é publico
    $reflection = new ReflectionMethod($controller, $nomeAction);
    if (!$reflection->isPublic()) {
        throw new RuntimeException("404 - Action nao existe");
    }

    /**
     * Controle de ACL
     */
    if (isset($config['acl'])) {
        if (!isset($config['acl'][$nomeRecursoAcl])) {
            //Nao existe esse recurso no acl
            throw new RuntimeException("304 - Sem permissao");
            //header("location: " . BASE_URL . "erro/404");
        } else if ($config['acl'][$nomeRecursoAcl] !== '*') {
            //Valida o recurso e a permissao do usuario
            $tipoUsuario = (isset($_SESSION['est_tipo'])) ? $_SESSION['est_tipo'] : null;
            if (!$tipoUsuario || !in_array($tipoUsuario, $config['acl'][$nomeRecursoAcl])) {
                // caso não tenha permissão para acessálo
                header("location: " . BASE_URL . "login");
            }
        }
    }

    //Executa a action
    $controller->$nomeAction();
} else {
    header("location: " . BASE_URL . "erro/404");
}

?>